// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.more;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.eva.android.AutoUpdateDaemon;
import com.eva.android.widget.BaseFragment;
import com.eva.android.widget.DataLoadingAsyncTask2;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.common.dto.AutoUpdateInfoFromServer;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.main.loginimpl.LoginHelper;
import com.x52im.rbchat.logic.more.avatar.AvatarHelper;
import com.x52im.rbchat.network.http.HttpRestHelper;
import com.x52im.rbchat.utils.IntentFactory;
import com.x52im.rbchat.utils.PreferencesToolkits;
import com.x52im.rbchat.utils.ToolKits;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/**
 * "我的" fragment实现类。
 *
 * @author Jack Jiang
 * @since 8.0
 */
public class MyFragment extends BaseFragment {

    private final static String TAG = MyFragment.class.getSimpleName();

    public final static int REQUEST_CODE_FOR_GO_TO_USER$ACTIVITY = 1;

    private ViewGroup currentUserBtn;
    private CheckBox msgToneChkBox;
    private Button msgToneBtn;
    private Button aboutUsBtn = null;
    private Button exitBtn = null;
    private Button helpBtn = null;
    private Button versionBtn = null;

    private ImageView viewlocalUserAvatar = null;

//    // 当此值为true时表示本Activity中已尝试过从服务端更新头像，否由表示未尝试过
//    // 此值的目的是控制头像从服务端的更新仅在本Activity的生命周期中执行1次以结省服务端性能和压力，仅此而已
//    private boolean tryGetAvatarFromServer = false;
//    private ShowUserAvatar showUserAvatarWrapper= null;

    // [注意]：setUserVisibleHint方法中切不可调用涉及ui的代码，所有有关ui的代码都都应放在onCreateView内或之后调用，
    //        否则可能因Fragment在Activity中的生命周期问题，导致fragment中getActivity()或getContext()为null，
    //        但很适合在这样的方法中借助ViewModel+LiveData进行数据的加载和刷新（因其能自动处理Fragment和Activity
    //        的生命周期问题，因而这样用非常安全可靠）
//    @Override
//    public void setUserVisibleHint(boolean isVisibleToUser) {
//        super.setUserVisibleHint(isVisibleToUser);
//        if (isVisibleToUser) {
//            this.refreshDatas();
//        }
//    }

    // 注意：Fragment中的onResume方法，在很多时候并不像Activity那样能被即时调用（比如当多个Fragment放置于
    // ViewPager中时，子fragment的左右切换是不会触发Fragment的onResume方法，此时就需要与 setUserVisibleHint
    // 方法进行配合才能保证兜底（理论上，Fragment中的setUserVisibleHint和onResume方法，在Fragment可见性改变时
    // 总有一个会被调用），这样就能确保像Activity中那样不错过任何一次可性的触发
    @Override
    public void onResume() {
        super.onResume();
        this.refreshDatas();
    }

    /**
     * 本方法由父类的 {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} 调用，子类可在此方法中实现ui的初始化。
     *
     * @see #onCreateView(LayoutInflater, ViewGroup, Bundle)
     */
    @Override
    protected View initViews(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
        View view = inflater.inflate(R.layout.main_my_fragment, container, false);

        currentUserBtn = view.findViewById(R.id.main_more_settings_currentUserBtn);
        msgToneChkBox = view.findViewById(R.id.sms_block_info_switch);
        msgToneBtn = view.findViewById(R.id.main_more_settings_recordLoginNameBtn);
        exitBtn = view.findViewById(R.id.main_more_settings_exitSystemBtn);
        aboutUsBtn = view.findViewById(R.id.main_more_settings_aboutBtn);
        helpBtn = view.findViewById(R.id.main_more_settings_helpBtn);
        viewlocalUserAvatar = view.findViewById(R.id.main_more_settings_avatarView);
        versionBtn = view.findViewById(R.id.main_more_settings_currentVersionBtn);

        // 根据本地数据设置是否选中
        msgToneChkBox.setChecked(PreferencesToolkits.isAPPMsgToneOpen(getContext()));

        return view;
    }

    /**
     * 本方法由父类的 {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} 调用，子类可在此方法中实现ui的事件监听器初始化。
     */
    @Override
    protected void initListeners()
    {
        // 点击头像看大图
        viewlocalUserAvatar.setOnClickListener(v -> {
            // 本地用户信息
            RosterElementEntity u = lu();
            if(u != null)
                AvatarHelper.showAvatarImage(getActivity(), u.getUser_uid(), null);
        });

        // 点击进入”个人中心“
        currentUserBtn.setOnClickListener(v -> {
            Intent intent = new Intent(getContext(), UserActivity.class);
            startActivityForResult(intent, REQUEST_CODE_FOR_GO_TO_USER$ACTIVITY);
        });

        // 点击"退出登陆"
        exitBtn.setOnClickListener(v -> new AlertDialog.Builder(getContext())
                .setTitle($$(R.string.general_are_u_sure))
                .setMessage($$(R.string.main_more_msg_tone_exit_to_login))
                .setPositiveButton($$(R.string.general_ok), (dialog, which) -> ToolKits.exitAndGotoLogin(getActivity()))
                .setNegativeButton($$(R.string.general_cancel), null)
                .show());

        // 点击进入“关于我们”
        aboutUsBtn.setOnClickListener(v -> startActivity(new Intent(getContext(), AboutActivity.class)));

        // 消息通知开关
        msgToneBtn.setOnClickListener(v -> msgToneChkBox.setChecked(!msgToneChkBox.isChecked()));
        // 消息能知状态单选框
        msgToneChkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
            PreferencesToolkits.setAPPMsgToneOpen(getActivity(), isChecked);
            WidgetUtils.showToast(getActivity(), $$(isChecked ? R.string.main_more_msg_tone_opend_hint : R.string.main_more_msg_tone_closed_hint), WidgetUtils.ToastType.OK);
        });

        // 点击进入”帮助中心“
        helpBtn.setOnClickListener(v -> startActivity(IntentFactory.createHelpActivityIntent(getActivity()
                , HelpActivity.FININSH_VIEWPAGE_FINISHACTIVITY, true)));

        // 版本检查
        versionBtn.setOnClickListener(v -> new VersionCheckAsyncTask().execute());
    }

    /**
     * 刷新界面数据显示。
     */
    private void refreshDatas() {
        try {
            // 把用户名设置到”当前登陆用户“组件上，以便查看
            RosterElementEntity u = lu();
            if (u != null) {
                ((TextView) getView().findViewById(R.id.main_more_settings_currentUserInfoView)).setText(u.getNickname());
                ((TextView) getView().findViewById(R.id.main_more_settings_kchatIdView)).setText("Chat ID: " + u.getUser_uid());
            }

            ((TextView) getView().findViewById(R.id.main_more_settings_currentVersionInfoView)).setText(
                    LoginHelper.getAPKVersionName() + "(" + LoginHelper.getAPKVersionCode() + ")");

            // 显示本地用户头像
            ImageCacheLoader.loadAvatarImgWithGlide(this, u.getUser_uid(), u.getUserAvatarFileName(), viewlocalUserAvatar
                    , 30, R.drawable.default_avatar_yuan_60_3x, false, false);
        }
        catch (Exception e){
            Log.w(TAG, e);
        }
    }

    //----------------------------------------------------------------------------------------------------------
    /**
     * 从下一个Activity回来后的数据回调。
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
    {
        if(resultCode != Activity.RESULT_OK) {
            //result is not correct
            return;
        }

        // 从个人信息界面返回的，那么就尝试刷新他的头像吧（因为在这个界面里可能修改了用户的头像哦）
        if(requestCode == REQUEST_CODE_FOR_GO_TO_USER$ACTIVITY) {
            RosterElementEntity u = lu();
            if(u != null) {
                // 因为有onResume()方法中的刷新，所以此处就没必要刷新了！
//                // 更新本地用户头像
//                UserActivity.loadAvatarImgWithGlide(this, u, viewlocalUserAvatar);
////                new ShowUserAvatar(getActivity(), u.getUser_uid(), viewlocalUserAvatar
////                        // 注意：此时就没有必要尝试从服务端更新头像了，因为在用户个人信息界面里如果要更新那么就已经存了一个新缓存到本地了
////                        , false
////                        , 120 , 120 // 此头像用于界面中好友的头像显示，大小参考：main_more布局中的@+id/main_more_settings_avatarView（60dp*60dp）
////                ).showCahedAvatar();
            }
        }

        super.onActivityResult(requestCode, resultCode, data);
    }


    //----------------------------------------------------------------------------------------------------------- inner class
    /**
     * 版本检查线程实现内部类.
     *
     * @author Jack Jiang
     */
    protected class VersionCheckAsyncTask extends DataLoadingAsyncTask2<Object, Integer, DataFromServer> {
        public VersionCheckAsyncTask() {
            super(getActivity(), $$(R.string.main_more_version_check_loading));
        }

        /**
         * 在后台执行数据的网络提交和处于结果的读取 .
         *
         * @param parems 外界传进来的参数
         * @return 查询结果，将传递给onPostExecute(..)方法
         */
        @Override
        protected DataFromServer doInBackground(Object... parems) {
            return HttpRestHelper.submitCheckUpdateToServer(""+LoginHelper.getAPKVersionCode());
        }

        /**
         * 处理服务端返回的登陆结果信息.
         *
         * @see AutoUpdateDaemon
         */
        protected void onPostExecuteImpl(Object jsonOfResult) {

            if(getActivity() == null){
                Log.w(TAG, "getActivity() == null，VersionCheckAsyncTask.onPostExecuteImpl(..)无法继续!");
                return;
            }

            if(jsonOfResult instanceof String) {
                final AutoUpdateInfoFromServer aui = HttpRestHelper.parseCheckUpdateFromServer((String)jsonOfResult);
                if(aui.isNeedUpdate()) {
                    Log.d("MoreActivity", "isNeedUpdate?"+aui.isNeedUpdate()
                            +",getLatestClientAPKVercionCode="+aui.getLatestClientAPKVercionCode()
                            +",getLatestClientAPKFileSize="+aui.getLatestClientAPKFileSize()
                            +",getLatestClientAPKURL"+aui.getLatestClientAPKURL());

                    new AlertDialog.Builder(getActivity())
                            .setTitle($$(R.string.login_form_have_latest_version))
                            .setMessage($$(R.string.login_form_have_latest_version_descrption))
                            .setPositiveButton($$(R.string.login_form_have_latest_version_update_now),  new DialogInterface.OnClickListener(){
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // 进入版本更新处理类进行更新处理
                                    AutoUpdateDaemon up=new AutoUpdateDaemon(getActivity()
                                            , aui.getLatestClientAPKVercionCode()
                                            , aui.getLatestClientAPKFileSize()
                                            , aui.getLatestClientAPKURL());
                                    try{
                                        up.doUpdate();
                                    }
                                    catch (Exception e){
                                        WidgetUtils.showToast(getActivity(), $$(R.string.login_form_version_error), WidgetUtils.ToastType.ERROR);
                                        Log.d("MoreActivity", "新版检查和下载时遇到错误，"+e.getMessage(), e);
                                    }
                                }
                            })
                            .setNegativeButton($$(R.string.login_form_have_latest_version_ignore),  null)
                            .show();
                }
                // 无需更新
                else
                {
                    // 更新检查（处理）完成后开始进入真正的登陆线程
                    new AlertDialog.Builder(getActivity())
                            .setTitle(R.string.general_prompt)
                            .setMessage(R.string.main_more_version_check_is_latest)
                            .setPositiveButton(R.string.general_ok,  null)
                            .show();
                }
            }
            else
            {
                Log.e(TAG, "服务端返回了无效的登陆反馈信息，result="+ jsonOfResult);
            }
        }
    }
}
